const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
import _ from "lodash";
import { Request, Response } from "express";
import { NextFunction } from "express-serve-static-core";
import { fullpage, slide, click } from "../sliderCode";

router.get("/register-fullpage", function(req: Request, res: Response) {
  // 向极验申请每次验证所需的challenge
  fullpage.register(null, function(err: any, data: any) {
    if (err) {
      console.error(err);
      res.status(500);
      res.send(err);
      return;
    }

    if (!data.success) {
      // 进入 failback，如果一直进入此模式，请检查服务器到极验服务器是否可访问
      // 可以通过修改 hosts 把极验服务器 api.geetest.com 指到不可访问的地址

      // 为以防万一，你可以选择以下两种方式之一：

      // 1. 继续使用极验提供的failback备用方案
      req.session.fallback = true;
      res.send(data);

      // 2. 使用自己提供的备用方案
      // todo
    } else {
      // 正常模式
      req.session.fallback = false;
      res.send(data);
    }
  });
});

router.post("/validate-fullpage", function(req: Request, res: Response) {
  // 对ajax提供的验证凭证进行二次验证
  fullpage.validate(
    req.session.fallback,
    {
      geetest_challenge: req.body.geetest_challenge,
      geetest_validate: req.body.geetest_validate,
      geetest_seccode: req.body.geetest_seccode
    },
    function(err: any, success: any) {
      if (err) {
        // 网络错误
        res.send({
          code: "sliderCode_net_error",
          data: undefined,
          msg: err
        });
      } else if (!success) {
        // 二次验证失败
        res.send({
          code: "sliderCode_verify_fail",
          data: req.body,
          msg: "error"
        });
      } else {
        res.send({
          code: 200,
          data: undefined,
          msg: "success"
        });
      }
    }
  );
});

router.get("/register-click", function(req: Request, res: Response) {
  // 向极验申请每次验证所需的challenge
  click.register(null, function(err: any, data: any) {
    if (err) {
      console.error(err);
      res.status(500);
      res.send(err);
      return;
    }

    if (!data.success) {
      // 进入 failback，如果一直进入此模式，请检查服务器到极验服务器是否可访问
      // 可以通过修改 hosts 把极验服务器 api.geetest.com 指到不可访问的地址

      // 为以防万一，你可以选择以下两种方式之一：

      // 1. 继续使用极验提供的failback备用方案
      req.session.fallback = true;
      res.send(data);

      // 2. 使用自己提供的备用方案
      // todo
    } else {
      // 正常模式
      req.session.fallback = false;
      res.send(data);
    }
  });
});
router.post("/validate-click", function(req: Request, res: Response) {
  // 对ajax提供的验证凭证进行二次验证
  click.validate(
    req.session.fallback,
    {
      geetest_challenge: req.body.geetest_challenge,
      geetest_validate: req.body.geetest_validate,
      geetest_seccode: req.body.geetest_seccode
    },
    function(err: any, success: any) {
      if (err) {
        // 网络错误
        res.send({
          status: "error",
          info: err
        });
      } else if (!success) {
        // 二次验证失败
        res.send({
          status: "fail",
          info: "登录失败"
        });
      } else {
        res.send({
          status: "success",
          info: "登录成功"
        });
      }
    }
  );
});

router.get("/register-slide", function(req: Request, res: Response) {
  // 向极验申请每次验证所需的challenge
  slide.register(null, function(err: any, data: any) {
    if (err) {
      console.error(err);
      res.status(500);
      res.send(err);
      return;
    }

    if (!data.success) {
      // 进入 failback，如果一直进入此模式，请检查服务器到极验服务器是否可访问
      // 可以通过修改 hosts 把极验服务器 api.geetest.com 指到不可访问的地址

      // 为以防万一，你可以选择以下两种方式之一：

      // 1. 继续使用极验提供的failback备用方案
      req.session.fallback = true;
      res.send(data);

      // 2. 使用自己提供的备用方案
      // todo
    } else {
      // 正常模式
      req.session.fallback = false;
      res.send(data);
    }
  });
});

router.post("/validate-slide", function(req: Request, res: Response) {
  // 对ajax提供的验证凭证进行二次验证
  slide.validate(
    req.session.fallback,
    {
      geetest_challenge: req.body.geetest_challenge,
      geetest_validate: req.body.geetest_validate,
      geetest_seccode: req.body.geetest_seccode
    },
    function(err: any, success: any) {
      if (err) {
        // 网络错误
        res.send({
          status: "error",
          info: err
        });
      } else if (!success) {
        // 二次验证失败
        res.send({
          status: "fail",
          info: "登录失败"
        });
      } else {
        res.send({
          status: "success",
          info: "登录成功"
        });
      }
    }
  );
});

export default router;
